package com.jiangxjsy.core.security.md5;

import com.jiangxjsy.core.security.PasswordEncoder;
import com.jiangxjsy.core.security.kit.Algorithm;
import com.jiangxjsy.core.security.kit.EncodedCredential;
import com.jiangxjsy.core.security.kit.SaltGenerator;
import org.apache.commons.codec.digest.DigestUtils;

/**
 * wukong-crm-master
 * 蒋胜宇
 * 2025/6/5 13:56
 */

public class Md5PasswordEncoder implements PasswordEncoder {
    private static final Algorithm ALGORITHM = Algorithm.MD5;


    /**
     * 加密原始密码
     *
     * @param rawPassword 原始密码（明文）
     * @param salt 盐值
     * @return 加密后的密码（包含算法标识）
     */
    @Override
    public EncodedCredential encode(CharSequence rawPassword, String salt) {
        String saltedPassword = rawPassword + salt;
        String hash = DigestUtils.md5Hex(saltedPassword);
        return new EncodedCredential(hash, salt, ALGORITHM);
    }

    /**
     * 加密原始密码
     *
     * @param rawPassword 原始密码（明文）
     * @return 加密后的密码（包含算法标识）
     */
    @Override
    public EncodedCredential encode(CharSequence rawPassword) {
        String salt = SaltGenerator.generate();
        return encode(rawPassword, salt);
    }

    /**
     * 验证密码是否匹配
     *
     * @param rawPassword 原始密码（明文）
     * @param credential 已加密的凭证（含盐值和算法）
     * @return 是否匹配
     */
    @Override
    public boolean matches(CharSequence rawPassword, EncodedCredential credential) {
        EncodedCredential newCredential = encode(rawPassword, credential.getSalt());
        return newCredential.getPasswordHash().equals(credential.getPasswordHash());
    }

    /**
     * 获取算法名称
     *
     * @return 算法名称
     */
    @Override
    public String getAlgorithm() {
        return ALGORITHM.getAlgorithm();
    }
}
